// src/stores/plc.js
import { defineStore } from 'pinia'
import { io } from 'socket.io-client'

export const usePlcStore = defineStore('plc', {
    state: () => ({
        // PLC 数据状态
        voltage: 0,                   // 电压值
        partialDischarge: 0,          // 局放值
        time: null,              // 时间
        frontSwitch: false,           // 前级开关
        endSwitch: false,              // 后级开关

        // 电压、局放、时间数组
        voltageArray: [],
        partialDischargeArray: [],
        timeArray: [],
        // Socket.IO 连接
        socket: null,
        isConnected: false,
        // 配置
        socketUrl: 'http://localhost:5010/plc' // 根据实际情况修改
    }),

    actions: {
        // 初始化 Socket.IO 连接
        initSocket() {
            // 防止重复初始化
            if (this.socket && this.socket.connected) {
                console.log('PLC Socket.IO 连接已存在')
                return
            }

            if (this.socket) {
                this.socket.disconnect()
            }

            try {
                // 创建 Socket.IO 连接
                this.socket = io(this.socketUrl, {
                    transports: ['websocket', 'polling'],
                    reconnection: true,
                    reconnectionDelay: 3000,
                })

                // 监听连接事件
                this.socket.on('connect', () => {
                    console.log('PLC Socket.IO 连接已建立')
                    this.isConnected = true
                })

                // 监听 PLC 数据事件
                this.socket.on('plc_update', (data) => {
                    this.updatePlcData(data)
                })

                // 监听连接断开事件
                this.socket.on('disconnect', () => {
                    console.log('PLC Socket.IO 连接已断开')
                    this.isConnected = false
                })

                // 监听连接错误事件
                this.socket.on('connect_error', (error) => {
                    console.error('PLC Socket.IO 连接错误:', error)
                    this.isConnected = false
                })

            } catch (error) {
                console.error('初始化 Socket.IO 失败:', error)
                this.isConnected = false
            }
        },

        // 更新 PLC 数据
        updatePlcData(data) {
            this.voltage = data.voltage
            this.partialDischarge = data.release1
            this.time = data.time
            this.frontSwitch = data.frontSwitch
            this.endSwitch = data.endSwitch

            console.log('PLC 数据更新:', data)

            // 添加到历史数据
            this.voltageArray.push([data.time, data.voltage])
            this.partialDischargeArray.push([data.time, data.release1])

            // 保持历史数据在合理范围内（例如最近1000个数据点）
            if (this.voltageArray.length > 600) {
                this.voltageArray.shift()
                this.partialDischargeArray.shift()
            }
        },

        // 发送命令到 PLC
        sendCommand(command, data = {}) {
            if (this.socket && this.isConnected) {
                this.socket.emit('plcCommand', { command, ...data })
            }
        },

        // 关闭 Socket.IO 连接
        closeSocket() {
            if (this.socket) {
                this.socket.disconnect()
                this.socket = null
                this.isConnected = false
            }
        }
    }
})